package org.ala.tree.lsm;

import org.ala.tree.lsm.tools.FileTools;

/**
 * lsm相关配置文件
 *
 * @author ala
 * @date 2025年5月25日
 */
public class LSMConfig {
	/**
	 * 	根目录
	 */
	public String ROOT_DIR;
	
	
	/************************************************************************************************************************
	 * MemTable相关配置
	 ************************************************************************************************************************/
	/**
	 * 一个MemTable包含多少个数据转为只读
	 */
	public int memTableCapacity = 512;
	/**
	 * 积攒了多少只MemTable后，落盘为L0层
	 */
	public int thresholdL0 = 1;
	
	
	/************************************************************************************************************************
	 * SSTable相关配置
	 ************************************************************************************************************************/
	/**
	 * 	每个数据块键值对数目
	 */
	public int blockCapacity = 32;
	/**
	 * 	每层目录前缀
	 */
	public String levelPrefix = "level_";
	/**
	 * 	最大层数
	 */
	public int maxLevel = 10;
	/**
	 * 	每层最大文件数（超过数量会触发合并）
	 */
	public int countLevel = 4;
	/**
	 * 	每次合并多少文件
	 * 	<p>	取值范围：[2, countLevel]。范围以外按countLevel处理
	 */
	public int countMerge = -1;
	
	
	/************************************************************************************************************************
	 * WAL相关配置
	 ************************************************************************************************************************/
	/**
	 * wal文件目录
	 * <p>	相对于ROOT_DIR
	 */
	public String WAL_DIR = "wal";
	/**
	 * wal文件buffer大小（单位：字节）
	 */
	public long WAL_BUFFER = 1l * 1024l;
	/**
	 * 	wal文件切片数
	 * 	<p>	单文件200Mb ~ 1G / s 的写入速度，如果超过这个速度需要切片
	 */
	public int walCount = 1;
	/**
	 * 	每个wal文件大小（单位：KB）
	 * 	<p>	推荐4096字节的整数倍
	 * 	<p>	实际文件大小不是严格整数倍，不足的零头将被舍弃（写入下个文件）
	 */
	protected long walSize = 4;
	/**
	 * wal文件字节大小
	 */
	public long walSizeByte() {
		return walSize * 1024l;
	}
	

	public LSMConfig(String rootDir) {
		super();

		if (rootDir.charAt(rootDir.length()-1) == '/') {rootDir = rootDir.substring(0, rootDir.length()-1);}
		this.ROOT_DIR = rootDir;
		
		active();
	}
	
	
	/**
	 * 	激活配置
	 */
	public void active() {
		//	建立wal目录
		FileTools.tryMakeDir(String.format("%s/%s", ROOT_DIR, WAL_DIR));
	}
	
	
}
